package cn.iocoder.yudao.module.hs.service.shiporder;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.hs.controller.admin.bigscreen.vo.WarehouseMaterialCount;
import cn.iocoder.yudao.module.hs.controller.admin.entryorder.vo.EntryOrderTrayRespVO;
import cn.iocoder.yudao.module.hs.controller.admin.shiporder.vo.*;
import cn.iocoder.yudao.module.hs.dal.dataobject.shiporder.ShipOrderDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 出库单 Service 接口
 *
 * @author 航盛
 */
public interface ShipOrderService {

    /**
     * 创建出库单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createShipOrder(@Valid ShipOrderSaveReqVO createReqVO);

    /**
     * 更新出库单
     *
     * @param updateReqVO 更新信息
     */
    void updateShipOrder(@Valid ShipOrderSaveReqVO updateReqVO);

    /**
     * 删除出库单
     *
     * @param id 编号
     */
    void deleteShipOrder(Long id);

    /**
     * 获得出库单
     *
     * @param id 编号
     * @return 出库单
     */
    ShipOrderDO getShipOrder(Long id);

    /**
     * 获得出库单分页
     *
     * @param pageReqVO 分页查询
     * @return 出库单分页
     */
    PageResult<ShipOrderRespVO> getShipOrderPage(ShipOrderPageReqVO pageReqVO);

    /**
     * 根据发货单号获取出库单
     *
     * @param code 发货单号
     * @return 出库单
     */
    ShipOrderDO getShipOrder(String code);

    /**
     * 根据状态获取出库单
     *
     * @param status 状态
     * @return 出库单
     */
    List<ShipOrderDO> getShipOrderListByStatus(List<String> status, String warehouseType);

    /**
     * 更新出库单状态为出库中
     *
     * @param shipOrderId 出库单ID
     */
    void ship(Long shipOrderId);

    /**
     * 创建三方仓出库单
     *
     * @param saveReqVO 创建信息
     * @return 编号
     */
    Long createManualShipOrder(@Valid ManualShipOrderSaveReqVO saveReqVO);

    /**
     * 查询当前用户所在仓库，指定的物料机型，所有出库单待出库的物料数量
     *
     * @param warehouseId
     * @param materialModeCode
     * @return
     */
    Integer getNotShipOverMaterialsCount(Long warehouseId, String materialModeCode);

    /**
     * 查询当日所有出库单出库的物料数量
     * @return
     */
    List<WarehouseMaterialCount> getWarehouseMaterialCountList();

    /**
     *
     * @return
     */
    Integer getProductWarehouseHistoryCount(boolean isToday);

    /**
     *
     * @return
     */
    Integer getProductWarehouseMonthCount();

    /**
     * 生产仓出库日志
     */
    void materialLogProductionShip(List<Long> materialIds);

    /**
     * 三方仓出日志
     */
    void materialLogTripartiteShip(List<Long> materialIds);

    /**
     * 获取出库单托盘列表
     * @param shipOrderId
     * @param warehouseId
     * @return
     */
    List<ShipOrderTrayRespVO> getTrayList(Long shipOrderId, Long warehouseId);

}